今さら聞けないXcodeのバージョン管理 Gitの基本的な使い方からGitHubへソースコードを公開するまで
今さらですがXcodeでGitを使ったバージョン管理の仕方をいろいろ調べたので調査結果をまとめたいと思います。調査した環境は以下になります。
- Mac OS X 10.8 Mountain Lion
- Xcode 5.0
XcodeでのGitの使い方の記事なので、Gitって何?もしくは バージョン管理って何?という方は以下の記事を見た後でご覧ください。
目次
ローカルリポジトリ
準備:ローカルリポジトリの作成
まずはバージョン管理するプロジェクトを作成しましょう。今回、テンプレートは Command Line Tool を使っています。最後にGitのローカルリポジトリを作成するかどうかを聞かれるのでチェックを入れておいてください。
プロジェクトが作成できたら main.m を変更していきましょう。最初から「Hello、 World!」をログに出力するソースがありますので、「こんにちは、世界!」にして保存します。すると以下のようにファイルに「M」というマークが付きます。追加の場合は「A」になります。
バージョンエディタに切り替えると修正点を確認できます。バージョンエディタへの切り替えは右上のボタンで行います。
コミットする
修正した箇所をローカルリポジトリにコミットしましょう。コンテキストメニューからコミットすることができます。
変更点を確認して問題なければコメントを入れてコミットします。
部分的にコミットしないこともできます。
ソースコードの変更を破棄する
ファイルの一部分を戻したい場合
バージョンエディタを開いて下さい。ローカルリポジトリとの差分が表示されます。戻したい箇所でDiscard Changeを選択すると戻せます。
ファイルごと戻したい場合
戻したいファイルを右クリックしてコンテキストメニューのDiscard Changesを選択します。
変更したファイルすべて戻したい場合
Source ControlメニューからDiscard All Changes...をクリックするとプロジェクト内の変更したファイルすべて元に戻ります。
変更履歴を確認する
バージョンエディタをログモードに切り替えると変更履歴を確認できます。
ちょっと分かりづらいのですがShow 1 modified fileという箇所をクリックすると1つ前のバージョンとの差分を見ることができます。
以前のバージョンとの差分を確認する
ローカルのソースコードと以前のバージョンとの差分を見たい場合があるかもしれません。そのような場合はまずバージョンエディタを開いて矢印のボタンを押します。
以下のようにタイムラインが表示されるので右側のスライダーを戻したいバージョンに合わせます。
部分的にですが以前のバージョンの状態に戻すこともできます。タイムライン上で右側を戻したいバージョン、左側をローカルにしてからタイムラインを閉じ、Discard Changeして戻します。
リモートリポジトリ
次はリモートレポジトリを使ってみたいと思います。リモートレポジトリはGitHubを使いたいと思います。 GitHubを使うにはアカウントが必要なので持ってない方は以下のサイトで作って下さい。
GitHub · Build software better, together.
準備:リモートリポジトリの作成
リモートリポジトリの作成はXcodeからはできないので今回はGitHubのクライアントツールを使います。GitHubのクライアントツールを使うと公開鍵ペアの作成とGitHubへの公開鍵の登録を自動でやってくれるので便利です。リポジトリの作成も簡単にできます。以下のサイトからダウンロードして下さい。
インストール後、起動するとGitHubのアカウント情報を求められるので入力します。その後、ローカルリポジトリを探してくれるので、リモートリポジトリを作成したいプロジェクトにチェックを入れてDoneボタンを押します。
ローカルリポジトリの一覧が表示されるので先に進みます。一覧に追加したい場合はプロジェクトフォルダをドラッグ&ドロップすると追加できます。
Push to GitHubのボタンを押下するとリモートリポジトリが作成されます。
上記以外の方法としては先にGitHubでリモートリポジトリを作成してから登録することも可能です。Source ControlメニューからConfigureをクリックします。
以下のようなウインドウが表示されるので+ボタンでリモートリポジトリを追加できます。GitHubのクライアントツールを使わない場合は自分で公開鍵ペアを作成して公開鍵をGitHubに登録する必要があります。
リモートリポジトリを複製する(Clone)
リモートレポジトリからローカルリポジトリを作成します。Source ControlメニューからCheck Out...を選択してください。以下のようなウインドウが表示されます。
GitHubのサイトでURLを参照できるのでコピペしてNextボタンを押して下さい。HTTPS、SSH どちらでもCloneできました。
リモートリポジトリを更新する(Push)
リモートレポジトリを更新します。Source ControlメニューからPush...を選択してください。
ブランチを選択してPushボタンを押します。
ローカルリポジトリにコミットする際に一緒にPushすることもできます。以下の画面で左下のチェックボックスにチェックを入れます。
リモートリポジトリから変更を取り込む(Pull)
リモートレポジトリの変更を取り込みます。Pullするとソースコードだけでなく変更履歴も取り込まれます。Source ControlメニューからPull...を選択してください。
Pullしたソースコードはローカルリポジトリに自動でコミットされるのでどこが変更されたか確認したい場合はローカルリポジトリの変更履歴を確認してください。
リモートリポジトリとの競合を解決する
自分が修正したソースコードをPushしようとした際に他の人がすでに更新済みの場合、競合が発生します。
この場合、前にPushした人の更新がなくならないよう自分の変更したソースコードにマージする必要があるのでリモートリポジトリからPullして下さい。他の人が変更した箇所がローカルで更新した箇所と違う箇所の場合は自動でマージされますが、同じ箇所の場合、以下のような画面になり手動で解決する必要があります。下に4つボタンがありますが、どれか選択するとPullすることができるようになります。
4つのボタンの意味は簡単に説明すると左から以下のような意味になります。
- ローカルのソースコードの後にリモートのソースコードを差し込む
- ローカルのソースコードのままにする
- ローカルのソースコードをリモートのソースコードに置き換える
- ローカルのソースコードの前にリモートのソースコードを差し込む
その他メモ
他に色々調べて知ったことです。
Xcodeで使えないGitの機能は?
Gitに関して私はあまり詳しくないのですが、知ってる機能でXcodeで(多分)使えないものを挙げていきます。
この機能を使いたい場合はコンソールを使うことになります。
- リモートリポジトリの作成
- ファイルを指定してバージョン管理の対象から外す
- reset 指定したリビジョン以降のコミットをすべてなかったことにします。変更履歴は残りません。
- revert 指定したリビジョンのコミットを破棄します。変更履歴が残ります。
更新者の名前ってどこから取ってきてるの?
変更履歴に更新者の名前が出ています。これはどこからとってきた値なのでしょうか?ちょっと色々弄ってみた感じではMacのログインアカウントっぽいです。アカウントを変えたら更新者の名前も変わりました。ソースファイルを生成すると一番上に Created by 名前 というコメントが表示されていますがここと同じではないかと思います。
スナップショットに関して
バージョン管理システムではありませんが、Xcodeではソースコードのスナップショットをとることができます。FileメニューのCreate Snapshot...をクリックすると以下のような画面が表示されます。
取得したスナップショットはオーガナイザから確認することができます。
まとめ
最初、分散型のバージョン管理システムは面倒というイメージがあったのですがやってみたら意外と簡単でした。今回紹介した機能は基本的なものに絞ってますが、実際の開発ではブランチを使うこともあるとは思いますので次の機会ではその辺りを書いていきたいと思います。最後に現在、弊社のブログではiOS 7の特集をやってますので興味がある方はこちらもぜひご覧ください。